package cn.mrlong.aavdemo.opengl;

import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import android.opengl.Matrix;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

/**
 * @author MrLong
 * @version 1.0
 * @date 2021/01/27 下午 05:35
 */
public class MyGLRenderer implements GLSurfaceView.Renderer {
    // mMVPMatrix is an abbreviation for "Model View Projection Matrix"
    private final float[] mMVPMatrix = new float[16];
    private final float[] mProjectionMatrix = new float[16];
    private final float[] mViewMatrix = new float[16];
    private Triangle triangle;

    /**
     * 在View的OpenGL环境被创建的时候调用。
     *
     * @param gl
     * @param config
     */
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // Set the background frame color
        //绘制一个纯色背景
        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        //绘制一个三角形
        triangle = new Triangle();

    }

    /**
     * 如果视图的几何形状发生变化（例如，当设备的屏幕方向改变时），
     * 则调用此方法。
     *
     * @param gl
     * @param width
     * @param height
     */
    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        GLES20.glViewport(0, 0, width, height);
        // this projection matrix is applied to object coordinates
        // in the onDrawFrame() method
        float ratio = (float) width / height;
        Matrix.frustumM(mProjectionMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
    }

    /**
     * 每一次View的重绘都会调用
     *
     * @param gl
     */
    @Override
    public void onDrawFrame(GL10 gl) {
        // Redraw background color
        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);

        // Set the camera position (View matrix)
        //Matrix.setLookAtM (float[] rm,      //接收相机变换矩阵
        //                int rmOffset,       //变换矩阵的起始位置（偏移量）
        //                float eyeX,float eyeY, float eyeZ,   //相机位置
        //                float centerX,float centerY,float centerZ,  //观测点位置
        //                float upX,float upY,float upZ)  //up向量在xyz上的分量
        Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f);
        // Calculate the projection and view transformation
        //Matrix.multiplyMM (float[] result, //接收相乘结果
        //                int resultOffset,  //接收矩阵的起始位置（偏移量）
        //                float[] lhs,       //左矩阵
        //                int lhsOffset,     //左矩阵的起始位置（偏移量）
        //                float[] rhs,       //右矩阵
        //                int rhsOffset)     //右矩阵的起始位置（偏移量）
        Matrix.multiplyMM(mMVPMatrix, 0, mProjectionMatrix, 0, mViewMatrix, 0);

        triangle.draw(mMVPMatrix);
    }

    //Shader们包含了OpenGLShading Language (GLSL)代码，必须在使用前编译。要编译这些代码，在你的Renderer类中创建一个工具类方法：
    public static int loadShader(int type, String shaderCode) {
        // create a vertex shader type (GLES20.GL_VERTEX_SHADER)
        // or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
        int shader = GLES20.glCreateShader(type);
        // add the source code to the shader and compile it
        GLES20.glShaderSource(shader, shaderCode);
        GLES20.glCompileShader(shader);
        return shader;
    }

}
